import dayjs from 'dayjs'
import relativeTime from 'dayjs/plugin/relativeTime'
import 'dayjs/locale/zh-cn'

// 配置dayjs
dayjs.extend(relativeTime)
dayjs.locale('zh-cn')

/**
 * 格式化日期时间
 * @param date 日期对象或时间戳
 * @param format 格式化模板，默认为'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的日期字符串
 */
export const formatDate = (date: Date | number | string, format: string = 'YYYY-MM-DD HH:mm:ss'): string => {
  return dayjs(date).format(format)
}

/**
 * 获取相对时间（如：刚刚、5分钟前、3小时前、昨天）
 * @param date 日期对象或时间戳
 * @returns 相对时间字符串
 */
export const getRelativeTime = (date: Date | number | string): string => {
  return dayjs(date).fromNow()
}

/**
 * 格式化文件大小
 * @param bytes 字节数
 * @param decimals 小数位数，默认为2
 * @returns 格式化后的文件大小字符串
 */
export const formatFileSize = (bytes: number, decimals: number = 2): string => {
  if (bytes === 0) return '0 Bytes'

  const k = 1024
  const dm = decimals < 0 ? 0 : decimals
  const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']

  const i = Math.floor(Math.log(bytes) / Math.log(k))

  return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]
}

/**
 * 格式化持续时间
 * @param seconds 秒数
 * @returns 格式化后的持续时间字符串
 */
export const formatDuration = (seconds: number): string => {
  if (seconds < 60) {
    return `${Math.floor(seconds)}秒`
  } else if (seconds < 3600) {
    const mins = Math.floor(seconds / 60)
    const secs = Math.floor(seconds % 60)
    return `${mins}分${secs}秒`
  } else {
    const hours = Math.floor(seconds / 3600)
    const mins = Math.floor((seconds % 3600) / 60)
    return `${hours}小时${mins}分`
  }
}

/**
 * 获取今天的日期字符串
 * @param format 格式化模板，默认为'YYYY-MM-DD'
 * @returns 今天的日期字符串
 */
export const getToday = (format: string = 'YYYY-MM-DD'): string => {
  return dayjs().format(format)
}

/**
 * 获取昨天的日期字符串
 * @param format 格式化模板，默认为'YYYY-MM-DD'
 * @returns 昨天的日期字符串
 */
export const getYesterday = (format: string = 'YYYY-MM-DD'): string => {
  return dayjs().subtract(1, 'day').format(format)
}

/**
 * 获取本周的开始和结束日期
 * @param format 格式化模板，默认为'YYYY-MM-DD'
 * @returns 包含开始和结束日期的对象
 */
export const getCurrentWeekRange = (format: string = 'YYYY-MM-DD'): { start: string; end: string } => {
  const start = dayjs().startOf('week').format(format)
  const end = dayjs().endOf('week').format(format)
  return { start, end }
}

/**
 * 获取本月的开始和结束日期
 * @param format 格式化模板，默认为'YYYY-MM-DD'
 * @returns 包含开始和结束日期的对象
 */
export const getCurrentMonthRange = (format: string = 'YYYY-MM-DD'): { start: string; end: string } => {
  const start = dayjs().startOf('month').format(format)
  const end = dayjs().endOf('month').format(format)
  return { start, end }
}

/**
 * 获取今年的开始和结束日期
 * @param format 格式化模板，默认为'YYYY-MM-DD'
 * @returns 包含开始和结束日期的对象
 */
export const getCurrentYearRange = (format: string = 'YYYY-MM-DD'): { start: string; end: string } => {
  const start = dayjs().startOf('year').format(format)
  const end = dayjs().endOf('year').format(format)
  return { start, end }
}

/**
 * 判断是否为今天
 * @param date 日期对象或时间戳
 * @returns 是否为今天
 */
export const isToday = (date: Date | number | string): boolean => {
  return dayjs(date).isSame(dayjs(), 'day')
}

/**
 * 判断是否为昨天
 * @param date 日期对象或时间戳
 * @returns 是否为昨天
 */
export const isYesterday = (date: Date | number | string): boolean => {
  return dayjs(date).isSame(dayjs().subtract(1, 'day'), 'day')
}

/**
 * 判断是否在指定范围内
 * @param date 要检查的日期
 * @param startDate 开始日期
 * @param endDate 结束日期
 * @returns 是否在范围内
 */
export const isBetween = (date: Date | number | string, startDate: Date | number | string, endDate: Date | number | string): boolean => {
  return dayjs(date).isAfter(dayjs(startDate)) && dayjs(date).isBefore(dayjs(endDate))
}